package NowCoder.DynamicPlanning;
import java.util.*;

/**
 * 链接：https://www.nowcoder.com/questionTerminal/4727c06b9ee9446cab2e859b4bb86bb8?f=discussion
 * 来源：牛客网
 *
 * 最长公共子序列
 * 时间限制：C/C++ 2秒，其他语言4秒 空间限制：C/C++ 256M，其他语言512M
 * 给定两个字符串str1和str2，输出两个字符串的最长公共子序列。如果最长公共子序列为空，则输出-1。
 *
 * 输入描述:
 * 输出包括两行，第一行代表字符串str1，第二行代表str2。
 * (1≤length(str1),length(str2)≤5000)
 *
 * 输出描述:
 * 输出一行，代表他们最长公共子序列。如果公共子序列的长度为空，则输出-1。
 * 示例1
 * 输入
 * 1A2C3D4B56
 * B1D23CA45B6A
 * 输出
 * 123456
 * 说明
 * "123456"和“12C4B6”都是最长公共子序列，任意输出一个。
 *
 * 备注:
 * 时间复杂度 O(n∗m)，空间复杂度 O(n∗m)。(n,m分别表示两个字符串长度)
 */
public class 最长公共子序列_编程_2_7_12 {
    //TODO:请重新做这道题
    public static String process(String str1, String str2) {
        if (str1 == null || str1.length() == 0 || str2 == null || str2.length() == 0) {
            return "";
        }
        char[] char1 = str1.toCharArray();
        char[] char2 = str2.toCharArray();
        int[][] dp = dp(char1, char2);
        int m = str1.length() - 1;
        int n = str2.length() - 1;
        char[] res = new char[dp[m][n]];
        int index = res.length - 1;

        while (index >= 0) {
            if (n > 0 && dp[m][n] == dp[m][n - 1]) {
                n--;
            } else if (m > 0 && dp[m][n] == dp[m - 1][n]) {
                m--;
            } else {
                res[index--] = char1[m];
                m--;
                n--;
            }
        }

        return String.valueOf(res);
    }

    public static int[][] dp(char[] str1, char[] str2) {
        int[][] dp = new int[str1.length][str2.length];
        dp[0][0] = str1[0] == str2[0] ? 1 : 0;

        for (int i = 1; i < str1.length; i++) {
            dp[i][0] = Math.max(dp[i - 1][0], str1[i] == str2[0] ? 1 : 0);
        }
        for (int i = 1; i < str2.length; i++) {
            dp[0][i] = Math.max(dp[0][i - 1], str2[i] == str1[0] ? 1 : 0);
        }
        for (int i = 1; i < str1.length; i++) {
            for (int j = 1; j < str2.length; j++) {
                int max = Math.max(dp[i - 1][j], dp[i][j - 1]);
                if (str1[i] == str2[j]) {
                    max = Math.max(dp[i - 1][j - 1] + 1, max);
                }
                dp[i][j] = max;
            }
        }
        return dp;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        while(sc.hasNext()){
            String str1 = sc.next();
            String str2 = sc.next();
            System.out.println(process(str1, str2).length());
        }
    }
}
